package cn.dengta.context.model;

import java.util.*;
import java.util.stream.Collectors;
import javax.annotation.Nonnull;

import cn.dengta.common.model.ValueProxy;
import cn.dengta.context.web.ImageConverter;
import lombok.Getter;
import me.codeplayer.util.ArrayUtil;
import me.codeplayer.util.CollectionUtil;

import static cn.dengta.context.model.UserEnumI18nKey.*;

/**
 * 区域（国家或地区）（取名 Locale 容易与 <code>java.util.Locale</code> 冲突，因此取名 Country  ）
 */
@Getter
public enum Country implements LabelI18nProxy<Country, String> {
	/** 中国（大陆） */
	CN(COUNTRY_CN, Set.of(WesKit.main)),
	/** 香港（中國） */
	HK(COUNTRY_HK, Set.of()),
	/** 台灣（中國） */
	TW(COUNTRY_TW, Set.of()),
	/** 澳门（中國） */
	MO(COUNTRY_MO, Set.of()),
	/** 越南（Việt Nam） */
	VN(COUNTRY_VN, Set.of()),
	/** 韩国 */
	KR(COUNTRY_KR, Set.of()),
	/** 日本 */
	JP(COUNTRY_JP, Set.of()),
	/** 泰国 */
	TH(COUNTRY_TH, Set.of()),
	/** 印尼 */
	ID(COUNTRY_ID, Set.of()),
	/** 印度 */
	IN(COUNTRY_IN, Set.of()),
	/** 菲律宾 */
	PH(COUNTRY_PH, Set.of()),
	/** 马来西亚 */
	MY(COUNTRY_MY, Set.of()),

	// 北美--------------------
	/** 美国 */
	US(COUNTRY_US, Set.of()),
	/** 加拿大 */
	CA(COUNTRY_CA, Set.of()),

	// 拉美-------------------
	/** 墨西哥 */
	MX(COUNTRY_MX, Set.of()),
	/** 阿根廷 */
	AR(COUNTRY_AR, Set.of()),
	/** 巴西 */
	BR(COUNTRY_BR, Set.of()),
	/** 智利 */
	CL(COUNTRY_CL, Set.of()),
	/** 哥伦比亚 */
	CO(COUNTRY_CO, Set.of()),
	/** 委内瑞拉 */
	VE(COUNTRY_VE, Set.of()),
	/** 秘鲁 */
	PE(COUNTRY_PE, Set.of()),
	/** 厄瓜多尔 */
	EC(COUNTRY_EC, Set.of()),
	/** 危地马拉 */
	GT(COUNTRY_GT, Set.of()),
	/** 萨尔瓦多 */
	SV(COUNTRY_SV, Set.of()),
	/** 哥斯达黎加 */
	CR(COUNTRY_CR, Set.of()),
	/** 古巴 */
	CU(COUNTRY_CU, Set.of()),
	/** 多米尼加共和国 */
	DO(COUNTRY_DO, Set.of()),
	/** 海地 */
	HT(COUNTRY_HT, Set.of()),
	/** 洪都拉斯 */
	HN(COUNTRY_HN, Set.of()),
	/** 尼加拉瓜 */
	NI(COUNTRY_NI, Set.of()),
	/** 巴拿马 */
	PA(COUNTRY_PA, Set.of()),
	/** 巴拉圭 */
	PY(COUNTRY_PY, Set.of()),
	/** 波多黎各 */
	PR(COUNTRY_PR, Set.of()),
	/** 乌拉圭 */
	UY(COUNTRY_UY, Set.of()),

	// 欧洲-----------------------
	/** 英国 */
	GB(COUNTRY_GB, Set.of()),
	/** 法国 */
	FR(COUNTRY_FR, Set.of()),
	/** 德国 */
	DE(COUNTRY_DE, Set.of()),
	/** 意大利 */
	IT(COUNTRY_IT, Set.of()),
	/** 西班牙 */
	ES(COUNTRY_ES, Set.of()),
	/** 荷兰 */
	NL(COUNTRY_NL, Set.of()),
	/** 比利时 */
	BE(COUNTRY_BE, Set.of()),
	/** 瑞士 */
	CH(COUNTRY_CH, Set.of()),
	/** 希腊 */
	GR(COUNTRY_GR, Set.of()),
	/** 冰岛 */
	IS(COUNTRY_IS, Set.of()),
	/** 葡萄牙 */
	PT(COUNTRY_PT, Set.of()),
	/** 奥地利 */
	AT(COUNTRY_AT, Set.of()),
	/** 丹麦 */
	DK(COUNTRY_DK, Set.of()),
	/** 爱尔兰 */
	IE(COUNTRY_IE, Set.of()),
	/** 芬兰 */
	FI(COUNTRY_FI, Set.of()),
	/** 挪威 */
	NO(COUNTRY_NO, Set.of()),
	/** 瑞典 */
	SE(COUNTRY_SE, Set.of()),

	// 北非 -----------------
	/** 埃及 */
	EG(COUNTRY_EG, Set.of()),
	/** 阿尔及利亚 */
	DZ(COUNTRY_DZ, Set.of()),
	/** 利比亚 */
	LY(COUNTRY_LY, Set.of()),
	/** 摩洛哥 */
	MA(COUNTRY_MA, Set.of()),
	/** 苏丹 */
	SD(COUNTRY_SD, Set.of()),
	/** 突尼斯 */
	TN(COUNTRY_TN, Set.of()),
	/** 毛里塔尼亚 */
	MR(COUNTRY_MR, Set.of()),

	// 中东 ---------------------------------
	/** 沙特阿拉伯 */
	SA(COUNTRY_SA, Set.of()),
	/** 阿联酋 */
	AE(COUNTRY_AE, Set.of()),
	/** 卡塔尔 */
	QA(COUNTRY_QA, Set.of()),
	/** 科威特 */
	KW(COUNTRY_KW, Set.of()),
	/** 阿曼 */
	OM(COUNTRY_OM, Set.of()),
	/** 巴林 */
	BH(COUNTRY_BH, Set.of()),
	/** 伊拉克 */
	IQ(COUNTRY_IQ, Set.of()),
	/** 约旦 */
	JO(COUNTRY_JO, Set.of()),
	/** 黎巴嫩 */
	LB(COUNTRY_LB, Set.of()),
	/** 叙利亚 */
	SY(COUNTRY_SY, Set.of()),
	/** 也门 */
	YE(COUNTRY_YE, Set.of()),
	/** 伊朗 */
	IR(COUNTRY_IR, Set.of()),
	/** 以色列 */
	IL(COUNTRY_IL, Set.of()),
	/** 巴勒斯坦 */
	PS(COUNTRY_PS, Set.of()),
	/** 土耳其 */
	TR(COUNTRY_TR, Set.of()),
	;
	/** 国旗 */
	String nationalFlag;
	public final Set<WesKit> wesKits;
	final ValueProxy<Country, String> proxy;

	Country(String label) {
		this(label, null);
	}

	Country(String label, Set<WesKit> wesKits) {
		this.wesKits = wesKits;
		this.proxy = new ValueProxy<>(this, name(), label);
	}

	public static final Country[] CACHE = values();
	public static final String GLOBAL_FLAG = "https://oss.flala6.com/internal/pic/flag/global_1.png!dt";

	/** 国旗/区旗 */
	public String getNationalFlag() {
		final String cdn = AppContext.inter() ? ImageConverter.CDN_INCHAT : ImageConverter.CDN;
		return cdn + "/internal/pic/country/" + getValue().toLowerCase() + ".png!dt";
	}

	public static boolean fromHMT(Country country) {
		return ArrayUtil.ins(country, Country.HK, Country.MO, Country.TW);
	}

	public static boolean fromChina(Country country) {
		return ArrayUtil.ins(country, ALL_CHINA);
	}

	public String getNationalShortFlag() {
//		return "https://oss.flala6.com/internal/pic/flag/" + getValue() + "_1.png!dt";
		return getNationalFlag();
	}

	/** 中国任意地区（含港澳台） */
	public static final Country[] ALL_CHINA = { CN, TW, HK, MO };

	public static Country of(String value) {
		return CN.getValueOf(value);
	}

	public static Map<Integer, List<Map<String, String>>> nationalLanguageMap;
	public static Map<Integer, List<Map<String, String>>> shortNationalLanguageMap;

	public static List<Map<String, String>> getNationalList(boolean bigOrSmall, @Nonnull Language language) {
		Map<Integer, List<Map<String, String>>> map = bigOrSmall ? nationalLanguageMap : shortNationalLanguageMap;
		if (map == null) {
			map = CollectionUtil.newHashMap(Language.CACHE.length);
		}
		return map.computeIfAbsent(language.getValue(), l -> Arrays.stream(CACHE).map(t -> Map.of("value", t.getValue(), "label", t.getLabel(language), "nationalFlag", bigOrSmall ? t.getNationalFlag() : t.getNationalShortFlag())).collect(Collectors.toList()));
	}

	public static Country[] getCountries(WesKit wesKit) {
		return wesKit == null ? CACHE : Arrays.stream(CACHE).filter(t -> t.wesKits.contains(wesKit)).collect(Collectors.toSet()).toArray(Country[]::new);
	}

	public static List<OptionExt<String>> toMetas(WesKit wesKit, Language language) {
		Country[] countries = getCountries(wesKit);
		final List<OptionExt<String>> list = new ArrayList<>(countries.length);
		for (Country country : countries) {
			OptionExt<String> ext = new OptionExt<>(country.getValue(), country.getLabel(language), null);

			list.add(ext);
		}
		return list;
	}

}
